Un tete a tete con Teté


In [1]:
#include <stdio.h>

//Constantes en C
#define CADENA "Un tete a tete con tete"
#define SUBCADENA "te"

/*
* Funcion que busca la ultima aparicion de una sub-cadena dada en otra cadena.
* Devuelve la posicion donde comienza la sub-cadena, o -1 en caso de no encontrarla.
*/
int buscar_ultimo(char* cadena,char* subcadena); // Definicion del prototipo

int buscar_ultimo(char* cadena,char* subcadena){
    if (!cadena[0]) //Caso cadena[0]=='\n'
        return 0;
    
    int posicion = buscar_ultimo(cadena+1,subcadena);
    
    if (posicion > -1) //Caso ya se encontro, entonces no es el ultimo
        return posicion + 1; //Actualizo la posicion
    
    int i = 0;
    while (cadena[i] && subcadena[i] && cadena[i]==subcadena[i])
        i++; //Busco donde dejan de ser iguales, o una se termina
    
    if (subcadena[i] == '\0')
        return 0; //Lo subcadena se termino, entonces esta
    else
        return -1; //No esta
    
    //return (subcadena[i]) ? -1 : 0 ; //Operador ternario en C
    // <condicion> ? <si verdadero> : <si falso>
}

int main(){
    int resultado = buscar_ultimo(CADENA,SUBCADENA);
    printf("Esta en la posicion: %d\n",resultado);
    return 0;
}



Esta en la posicion: 23

In [2]:
#include <stdio.h>

//Constantes en C
#define CADENA "Un tete a tete con tete"
#define SUBCADENA "te"

/*
* Funcion que busca la ultima aparicion de una sub-cadena dada en otra cadena.
* Devuelve la posicion donde comienza la sub-cadena, o -1 en caso de no encontrarla.
*/
int buscar_ultimo(char* cadena,char* subcadena); // Definicion del prototipo

int buscar_ultimo(char* cadena,char* subcadena){
    if (!cadena[0]) //Caso cadena[0]=='\n'
        return 0;
    
    int posicion = buscar_ultimo(cadena+1,subcadena);
    
    if (posicion > -1) //Caso ya se encontro, entonces no es el ultimo
        return posicion + 1; //Actualizo la posicion
    
    int i = 0;
    while (cadena[i] && subcadena[i] && cadena[i]==subcadena[i])
        i++; //Busco donde dejan de ser iguales, o una se termina
    
    //if (subcadena[i] == '\0')
    //    return 0; //Lo subcadena se termino, entonces esta
    //else
    //    return -1; //No esta
    
    return (subcadena[i]) ? -1 : 0 ; //Operador ternario en C
    // <condicion> ? <si verdadero> : <si falso>
}

int main(){
    int resultado = buscar_ultimo(CADENA,SUBCADENA);
    printf("Esta en la posicion: %d\n",resultado);
    return 0;
}



Esta en la posicion: 23

Ejercico de la nota de rescate


In [37]:
#include <stdio.h>
#include <stdbool.h>

#define TEXTO "En una tarde nublada y fria, dos ninos patinaban sin preocupacion sobre una laguna congelada. De repente el hielo se rompio, y uno de ellos cayo al agua. El otro agarro una piedra y comenzo a golpear el hielo con todas sus fuerzas, hasta que logro quebrarlo y asi salvar a su amigo."
#define NOTA "El parcial es el proximo viernes, estudien"
#define NOTA2 "En una laguna congelada"

bool se_puede_escribir_nota(char* texto,char* nota){
    int contadores[256] = {0};
    
    int i = 0;
    while (texto[i]){
        contadores[ texto[i] ]++;
        i++;
    }
    
    i = 0;
    while (nota[i]){
        contadores[ nota[i] ]--;
        if (contadores[ nota[i] ] < 0)
            return false;
        i++;
    }
    return true;
}

int main(){
    bool resultado = se_puede_escribir_nota(TEXTO,NOTA);
    if (resultado)
        printf("Se puede escribir la nota: '%s'\n",NOTA);
    else
        printf("No se puede escribir la nota: '%s'\n",NOTA);
    return 0;
}



No se puede escribir la nota: 'El parcial es el proximo viernes, estudien'

Ahora la version con pos incremento


In [36]:
#include <stdio.h>
#include <stdbool.h>

#define TEXTO "En una tarde nublada y fria, dos ninos patinaban sin preocupacion sobre una laguna congelada. De repente el hielo se rompio, y uno de ellos cayo al agua. El otro agarro una piedra y comenzo a golpear el hielo con todas sus fuerzas, hasta que logro quebrarlo y asi salvar a su amigo."
#define NOTA "El parcial es el proximo viernes, estudien"
#define NOTA2 "En una laguna congelada"

bool se_puede_escribir_nota(char* texto,char* nota){
    int contadores[256] = {0};
    
    int i = 0;
    while (texto[i]){
        contadores[ texto[i++] ]++;
    }
    
    i = 0;
    while (nota[i]){
        contadores[ nota[i] ]--;
        if (contadores[ nota[i++] ] < 0)
            return false;
    }
    return true;
}

int main(){
    bool resultado = se_puede_escribir_nota(TEXTO,NOTA2);
    if (resultado)
        printf("Se puede escribir la nota: '%s'\n",NOTA2);
    else
        printf("No se puede escribir la nota: '%s'\n",NOTA2);
    return 0;
}



Se puede escribir la nota: 'En una laguna congelada'

Pre y Pos incremento

Incremento primero y obtengo el valor vs obtengo el valor y luego incremento.


In [30]:
#include <stdio.h>

int main(){

    int i = 0;
    
    printf("%d \n",++i);
    printf("%d \n",++i);
    printf("%d \n",++i);
    printf("%d \n",++i);
    printf("%d \n",++i);
    printf("%d \n",++i);
    printf("%d \n",++i);
    
    return 0;
}



1 
2 
3 
4 
5 
6 
7 

In [31]:
#include <stdio.h>

int main(){

    int i = 0;
    
    printf("%d \n",i++);
    printf("%d \n",i++);
    printf("%d \n",i++);
    printf("%d \n",i++);
    printf("%d \n",i++);
    printf("%d \n",i++);
    printf("%d \n",i++);
    
    return 0;
}



0 
1 
2 
3 
4 
5 
6 

Nota de rescate: Version aritmetica de punteros

Disclaimer: No mirar si son impresionables (no les vamos a pedir que hagan nunca nada asi)


In [40]:
#include <stdio.h>
#include <stdbool.h>

#define TEXTO "En una tarde nublada y fria, dos ninos patinaban sin preocupacion sobre una laguna congelada. De repente el hielo se rompio, y uno de ellos cayo al agua. El otro agarro una piedra y comenzo a golpear el hielo con todas sus fuerzas, hasta que logro quebrarlo y asi salvar a su amigo."
#define NOTA "El parcial es el proximo viernes, estudien"
#define NOTA2 "En una laguna congelada"

bool se_puede_escribir_nota(char* texto,char* nota){
    int contadores[256] = {0};
    
    while ( *texto ){
        contadores[ *texto++ ]++;
    }
    
    while ( *nota ){
        contadores[ *nota ]--;
        if (contadores[ *nota++ ] < 0)
            return false;
    }
    return true;
}

int main(){
    bool resultado = se_puede_escribir_nota(TEXTO,NOTA);
    if (resultado)
        printf("Se puede escribir la nota: '%s'\n",NOTA);
    else
        printf("No se puede escribir la nota: '%s'\n",NOTA);
        
    resultado = se_puede_escribir_nota(TEXTO,NOTA2);
    if (resultado)
        printf("Se puede escribir la nota: '%s'\n",NOTA2);
    else
        printf("No se puede escribir la nota: '%s'\n",NOTA2);
        
    return 0;
}



No se puede escribir la nota: 'El parcial es el proximo viernes, estudien'
Se puede escribir la nota: 'En una laguna congelada'